package com.ruoyi.system.utils;

import java.beans.PropertyDescriptor;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 字段值格式化工具类，支持各种数据类型的友好展示
 */
public class FieldFormatUtils {

    /**
     * 获取对象所有字段及其格式化后的值
     */
    public static List<FieldValue> getObjectFields(Object obj) {
        List<FieldValue> fieldValues = new ArrayList<>();
        if (obj == null) {
            return fieldValues;
        }

        // 获取对象所有属性
        PropertyDescriptor[] descriptors = org.springframework.beans.BeanUtils.getPropertyDescriptors(obj.getClass());
        for (PropertyDescriptor pd : descriptors) {
            // 跳过class属性和无getter方法的属性
            if ("class".equals(pd.getName()) || pd.getReadMethod() == null) {
                continue;
            }

            try {
                // 调用getter方法获取属性值
                Object value = pd.getReadMethod().invoke(obj);
                // 格式化值
                String formattedValue = formatValue(value);
                
                FieldValue fieldValue = new FieldValue();
                fieldValue.setFieldName(pd.getName());
                fieldValue.setFieldValue(formattedValue);
                fieldValues.add(fieldValue);
            } catch (Exception e) {
                // 忽略反射异常，记录日志
                // log.warn("获取字段值失败: {}", pd.getName(), e);
            }
        }

        return fieldValues;
    }

    /**
     * 格式化不同类型的值为字符串
     */
    private static String formatValue(Object value) {
        if (value == null) {
            return "";
        }

        // 日期类型格式化
        if (value instanceof Date) {
            return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value);
        }
        
        // Java 8日期类型格式化
        if (value instanceof LocalDateTime) {
            return ((LocalDateTime) value).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        }
        if (value instanceof LocalDate) {
            return ((LocalDate) value).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        }
        
        // 数字类型格式化
        if (value instanceof BigDecimal) {
            return ((BigDecimal) value).toPlainString(); // 避免科学计数法
        }
        
        // 布尔类型格式化
        if (value instanceof Boolean) {
            return (Boolean) value ? "是" : "否";
        }
        
        // 数组和集合类型
        if (value.getClass().isArray() || value instanceof Iterable) {
            return value.toString(); // 简单处理，可根据需要扩展
        }

        // 默认直接转换为字符串
        return value.toString();
    }

    /**
     * 字段值模型
     */
    public static class FieldValue {
        private String fieldName;
        private String fieldValue;

        // getter和setter
        public String getFieldName() {
            return fieldName;
        }
        public void setFieldName(String fieldName) {
            this.fieldName = fieldName;
        }
        public String getFieldValue() {
            return fieldValue;
        }
        public void setFieldValue(String fieldValue) {
            this.fieldValue = fieldValue;
        }
    }
}
    